from builtins import print as _print
from sys import _getframe


# 自定义print函数 方便输出时候带上行号
def print(*arg, **kw):
	s = f'第{_getframe(1).f_lineno}行：'  # 注此处需加参数 1。
	return _print(s, *arg, **kw)


# ### (7)位运算符:    & |  ^ << >> ~

var1 = 19
var2 = 15

# & 按位与
res = var1 & var2
"""
000 ... 10011
000 ... 01111
000 ... 00011 => 3
"""
print(res)

# | 按位或
res = var1 | var2
"""
000 ... 10011
000 ... 01111
000 ... 11111
"""
print(res)

# ^ 按位异或
"""两个值不相同=>True 反之返回False"""
res = var1 ^ var2
"""
000 ... 10011
000 ... 01111
000 ... 11100
"""
print(res)

# << 左移 (相当于乘法)
"""5乘以2的n次幂"""
res = 5 << 1  # 10
res = 5 << 2  # 20
res = 5 << 3  # 40
print(res)

"""
000 ... 101  => 5
000 .. 1010  => 10
000 ..10100  => 20
000 .101000  => 40
"""

# >> 右移 (相当于除法)
"""5地板除2的n次幂"""
res = 5 >> 1  # 2
res = 5 >> 2  # 1
res = 5 >> 3  # 0
"""
000 ... 101
000 ... 010 => 2
000 ... 001 => 1
000 ... 000 => 0
"""
print(res)

# ~ 按位非 (针对于补码进行操作,按位取反,包含每一位)
""" -(n+1) """
# res = ~22
res = ~19
print(res)
"""
原码:000 ... 10011
反码:000 ... 10011
补码:000 ... 10011

补码:   000 ... 10011
按位非: 111 ... 01100

给你补码->原码
补码:111 ... 01100
反码:100 ... 10011
原码:100 ... 10100 => -20
"""

res = ~-19
print(res)
"""
原码:100 ... 10011
反码:111 ... 01100
补码:111 ... 01101

补码:   111 ... 01101
按位非: 000 ... 10010

给你补码->原码 (因为是正数 ,原反补相同)
000 ... 10010 => 19
"""

"""
总结:
	个别运算符:
		运算符优先级最高的: **
		运算符优先级最低的: =
		()可以提升优先级

	一元运算符 > 二元运算符 (优先级)
		一元运算符 : 同一时间,操作一个值 ~ - 
		二元运算符 : 同一时间,操作一个值 + - * / ....

	同一种类运算符:
		算数运算符 : 乘除 > 加减
		逻辑运算符 : () > not > and > or 
		位运算符   : ( << >> ) > & > ^ > |

	整体排序:
		算数运算符 > 位运算符 > 比较运算符 > 身份运算符 > 成员运算符 > 逻辑运算符
		赋值运算符用来做收尾
"""
a = 3
b = 40
res = 5 + 5 << 6 // a is b and False
"""
res = 10 << 2 is 40 and False
res = 40 is 40 and False
res = True and False
res = False
"""
print(res)

a = 3
b = 40
c = 6
# 用括号提升下优先级
res = (5 + 5) << (c // a) is b and False
print(res)